spring为什么要注入接口,而不是实现类 | 您所在的位置:网站首页 › 为什么是class one而不是one class › spring为什么要注入接口,而不是实现类 |
转自:https://www.cnblogs.com/lee10010/p/7888121.html
首先说明,注入的对象确实为实现类的对象。(并不是实现类的代理对象,注入并不涉及代理) 如果只是单纯注入是可以用实现类接收注入对象的,但是往往开发中会对实现类做增强,如事务,日志等,实现增强的AOP技术是通过动态代理实现的,而spring默认是JDK动态代理,对实现类对象做增强得到的增强类与实现类是兄弟关系,所以不能用实现类接收增强类对象,只能用接口接收。如: ![]() ![]() 由于以上原因,如果将对象注入给实现类而非接口的话,在代理时就会报错。 解决方法,让Spring强制使用Cglib代理: cglib代理类和实现类之间是父子关系,自然可以用父类(实现类)去接收子类对象(代理类对象即增强类对象)。 不过应该不会需要这么做,使用接口本来就是解耦的,你直接用实现类接收注入对象岂不是失去了注入的意义。(为什么不直接new一个呢?) |
CopyRight 2018-2019 实验室设备网 版权所有 |